/************************************************************************/
/* Original from PHYSX SDK 2.8.4 Sample Code	                        */
/************************************************************************/

#ifndef STREAM_H
#define STREAM_H

#include <NxStream.h>
#include <stdio.h>

class UserStream : public NxStream
{
    public:
                                UserStream(const char* filename, bool load);
    virtual						~UserStream();

    virtual		NxU8			readByte()								const;
    virtual		NxU16			readWord()								const;
    virtual		NxU32			readDword()								const;
    virtual		float			readFloat()								const;
    virtual		double			readDouble()							const;
    virtual		void			readBuffer(void* buffer, NxU32 size)	const;

    virtual		NxStream&		storeByte(NxU8 b);
    virtual		NxStream&		storeWord(NxU16 w);
    virtual		NxStream&		storeDword(NxU32 d);
    virtual		NxStream&		storeFloat(NxReal f);
    virtual		NxStream&		storeDouble(NxF64 f);
    virtual		NxStream&		storeBuffer(const void* buffer, NxU32 size);

                FILE*			fp;
};

class MemoryWriteBuffer : public NxStream
{
    public:
                                MemoryWriteBuffer();
    virtual						~MemoryWriteBuffer();
                void			clear();

    virtual		NxU8			readByte()								const	{ NX_ASSERT(0);	return 0;	}
    virtual		NxU16			readWord()								const	{ NX_ASSERT(0);	return 0;	}
    virtual		NxU32			readDword()								const	{ NX_ASSERT(0);	return 0;	}
    virtual		float			readFloat()								const	{ NX_ASSERT(0);	return 0.0f;}
    virtual		double			readDouble()							const	{ NX_ASSERT(0);	return 0.0;	}
    virtual		void			readBuffer(void* buffer, NxU32 size)	const	{ NX_ASSERT(0);				}

    virtual		NxStream&		storeByte(NxU8 b);
    virtual		NxStream&		storeWord(NxU16 w);
    virtual		NxStream&		storeDword(NxU32 d);
    virtual		NxStream&		storeFloat(NxReal f);
    virtual		NxStream&		storeDouble(NxF64 f);
    virtual		NxStream&		storeBuffer(const void* buffer, NxU32 size);

                NxU32			currentSize;
                NxU32			maxSize;
                NxU8*			data;
};

class MemoryReadBuffer : public NxStream
{
    public:
                                MemoryReadBuffer(const NxU8* data);
    virtual						~MemoryReadBuffer();

    virtual		NxU8			readByte()								const;
    virtual		NxU16			readWord()								const;
    virtual		NxU32			readDword()								const;
    virtual		float			readFloat()								const;
    virtual		double			readDouble()							const;
    virtual		void			readBuffer(void* buffer, NxU32 size)	const;

    virtual		NxStream&		storeByte(NxU8 b)							{ NX_ASSERT(0);	return *this;	}
    virtual		NxStream&		storeWord(NxU16 w)							{ NX_ASSERT(0);	return *this;	}
    virtual		NxStream&		storeDword(NxU32 d)							{ NX_ASSERT(0);	return *this;	}
    virtual		NxStream&		storeFloat(NxReal f)						{ NX_ASSERT(0);	return *this;	}
    virtual		NxStream&		storeDouble(NxF64 f)						{ NX_ASSERT(0);	return *this;	}
    virtual		NxStream&		storeBuffer(const void* buffer, NxU32 size)	{ NX_ASSERT(0);	return *this;	}

    mutable		const NxU8*		buffer;
};

#endif
